const db = require('../db/db')
// 引入密码加密解密工具包
const { encryption, decryption, createToken } = require('../utils/usersUtils.js')
// 引入redis方法
const redis = require('../redis/redis')
// 获取验证码
const { getCaptcha } = require('../utils/captchaUtils.js')
module.exports = {
    // 注册用户
    REGISTER: async (ctx, next) => {
        const { iphone, password } = ctx.request.body
        // 加密密码
        const bcryptPwd = await encryption(password)
        // 创建时间
        let create_time = new Date()
        // 集合注册信息
        const user = [iphone, bcryptPwd, create_time]
        // 判断用户是否存在
        const [result] = await db.promise().query('select * from users where iphone=?', iphone, (error, results) => {
            if (error) {
                console.log(error.message);
                return
            }
        })
        if (result.length > 0) {
            return ctx.body = {
                code: 202,
                msg: '用户已存在'
            }
        }
        // 进行注册
        const [results] = await db.promise().query('insert into users(iphone,password,create_time) values(?,?,?)', user, (error, results) => {
            if (error) {
                console.log(error.message);
                return
            }
        })
        if (results.affectedRows > 0) {
            ctx.body = {
                code: 200,
                msg: '注册成功'
            }
        }
    },
    // 用户登录
    LOGIN: async (ctx, next) => {
        
        const { iphone, password } = ctx.request.body
        // 验证用户是否存在
        await db.promise().query('select iphone from users where iphone=?', iphone).then(async res => {
            // 用户不存在
            if (res[0].length == 0) {
                ctx.body = {
                    code: 202,
                    msg: '用户不存在'
                }
            } else {
                // 验证密码是否正确
                await db.promise().query('select password from users where iphone=?', iphone).then(async res => {
                    // 数据库密码
                    let oldPwd = res[0][0].password
                    // 用户发送的密码
                    let newPwd = password
                    // 两者对比
                    const pwdIsTrue = await decryption(newPwd, oldPwd)
                    // 如果返回true,代表密码正确，否者密码错误
                    if (!pwdIsTrue) {
                        return ctx.body = {
                            code: 202,
                            msg: "密码错误"
                        }
                    } else {
                        // 账号密码通过创建token，返回用户信息
                        const token =  createToken()
                        await db.promise().query('select id,iphone,profile,identity,status from users where iphone=?', iphone).then(res => {
                            // 将用户信息token存入redis
                            const redisData = {
                                userInfo: res[0]
                            }
                            const redisDataIn = JSON.stringify(redisData)
                            // 登录成功删除原来存在redis的token
                            redis.delHashVal(ctx.header.authorization, 'user')
                            // 重新添加进redis
                            redis.setHashVal(token, 'user', redisDataIn)
                            // 返回用户所有信息
                            return ctx.body = {
                                code: 200,
                                msg: "登陆成功",
                                userInfo: res[0],
                                token: token
                            }
                        })
                    }
                })
            }
        })

    },
    // 获取用户信息
    GETUSERINFO: async (ctx, next) => {
        // 拿到token
        const token = ctx.header.authorization
        // 判断redis是否存在该token
        const isExists = await redis.isExistsHash(token)
        // 根据token查看redis是否存在该token,1存在，0不存在
        if (isExists == 1) {
            await redis.getHashVal(token, 'user').then(val => {
                // 延长时间
                redis.delayExpires(token,60*60*24)
                const userInfoRes = JSON.parse(val)
                ctx.body = {
                    code: 200,
                    msg: '获取用户信息成功',
                    userInfo:userInfoRes.userInfo[0]
                }
            }).catch(err => {
                console.log(err);
                ctx.body = {
                    code: 500,
                    msg: '获取用户信息失败',
                }
            })
        } else {
            ctx.body = {
                code: 203,
                status: 401,
                msg: 'token过期请重新登录',
                userInfo: ''
            }
        }
    },
    // 退出登录
    LOGOUT: async (ctx,next)=>{
        const token = ctx.header.authorization
        if(token){
            // // 摧毁token
            redis.delHashVal(token,'user').then(res=>{
                ctx.body = {
                    code:200,
                    msg:'退出登录成功'
                }
            }).catch(err=>{
                ctx.body = {
                    code:201,
                    msg:'退出登录失败'+err
                }
            })
        }else{
            ctx.body = {
                code:201,
                msg:'退出登录失败'
            }
        }
        
        
    },
    // 获取验证码
    GETCAPTCHA:async(ctx,next)=>{
            const captcha = getCaptcha(ctx,next)
            ctx.body = {
                code:200,
                msg:"获取验证码成功",
                captcha:captcha.newCaptcha
            }
    },
    // 删除验证码
    DELCAPTCHA:async(ctx,next)=>{
        const {captchaToken} = ctx.request.body
        redis.delHashVal(captchaToken, 'captcha')
        ctx.body = {
            code: 200,
            msg:'删除验证码成功'
        }
    },
    // 验证码登录
    CLOGIN: async (ctx, next) => {
        //获取数据
        const { username, password ,captcha ,captchaToken} = ctx.request.body
        // redis里面找captcha
        await redis.getHashVal(captchaToken, 'captcha').then(async res=>{
             // 获取验证码对比
        if(captcha.toLowerCase() !== JSON.parse(res).text.toLowerCase() )   
         ctx.body ={code:201,msg:'验证码错误'}
        else 
        // 验证用户是否存在
        await db.promise().query('select username from users where username=?', username).then(async res => {
            // 用户不存在
            if (res[0].length == 0) {
                ctx.body = {
                    code: 202,
                    msg: '用户不存在'
                }
            } else {
                // 验证密码是否正确
                await db.promise().query('select password from users where username=?', username).then(async res => {
                    // 数据库密码
                    let oldPwd = res[0][0].password
                    // 用户发送的密码
                    let newPwd = password
                    // 两者对比
                    const pwdIsTrue = await decryption(newPwd, oldPwd)
                    // 如果返回true,代表密码正确，否者密码错误
                    if (!pwdIsTrue) {
                        return ctx.body = {
                            code: 202,
                            msg: "密码错误"
                        }
                    } else {
                        // 账号密码通过创建token，返回用户信息
                        const token =  createToken()
                        await db.promise().query('select id,username,profile,identity,status from users where username=?', username).then(res => {
                            // 将用户信息token存入redis
                            const redisData = {
                                userInfo: res[0]
                            }
                            const redisDataIn = JSON.stringify(redisData)
                            // 登录成功删除原来存在redis的token
                            redis.delHashVal(ctx.header.authorization, 'user')
                            redis.delHashVal(captchaToken, 'captcha')
                            
                            // 重新添加进redis
                            redis.setHashVal(token, 'user', redisDataIn)
                            // 返回用户所有信息
                            return ctx.body = {
                                code: 200,
                                msg: "登陆成功",
                                userInfo: res[0],
                                token: token
                            }
                        }).catch(err=>{
                            console.log(err);
                            ctx.body ={
                                code:201,
                                msg:'服务器出错'+err
                            }})
                    }
                }).catch(err=>{
                    console.log(err);
                    ctx.body ={
                        code:201,
                        msg:'服务器出错'+err
                    }})
            }
        }).catch(err=>{
            console.log(err);
            ctx.body ={
                code:201,
                msg:'服务器出错'+err
            }
        })
        }).catch(err=>{
            ctx.body ={
                code:201,
                msg:'验证码过期，请刷新验证码'+err
            }
        })
    },
} 